package cn.tedu.ivos.base.fileUploadModule;

import cn.tedu.ivos.base.response.JsonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.UUID;

@Slf4j
@RestController
@RequestMapping("/v1/file")
public class UploadController {

    /**base.UploadController.upload(): 文件上传方法
     *MultipartFile用来接收上传图片文件的对象,形参名file必须与前端upload组件的name值一致!*/
    @PostMapping("/upload")  //@RequestParam("file") 为了根据key能准确接收文件上传的value
    public JsonResult uploadFile(@RequestParam("file") MultipartFile file)throws IOException {
        //1.得到原始文件名
        String originalFilename = file.getOriginalFilename();
        //2.获取原始文件名中的后缀名
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        //3.生成一个唯一不重复的随机字符串当做文件名
        String fileName=UUID.randomUUID().toString() + suffix;
        //4.指定一个磁盘文件夹用来存上传的图片文件,注意:这个路径得自己电脑上有!
        //String dirPath = "d:/files";
        String dirPath = System.getProperty("user.dir")+"/files/";
        //5.为了提高检索性能,我们可以设置一个自定义日期路径文件夹分层存储图片文件
        //一般以"年/月/日"的格式分级存上传的文件,比如: 2021/07/01
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd/HH/mm");
        //6.按照当前的实际日期,使用上述格式生成日期路径f
        String dateDir=sdf.format(new java.util.Date());
        //7.创建一个封装了上述路径的file对象
        File uploadDir=new File(dirPath+"/"+dateDir);
        //8.判断文件夹是否存在,如果不存在,则创建
        if(!uploadDir.exists()){
            uploadDir.mkdirs();//创建多层文件夹
        }
        //9.定义一个完整的图片路径 文件夹路径+日期路径+完整文件名
        String uploadFilePath=uploadDir.getAbsolutePath()+"/"+fileName;
        log.info("UploadController-upload(): 文件上传路径：{}" , uploadFilePath);
        //10.把上传的图片文件保存在指定的路径下
        file.transferTo(new File(uploadFilePath));
        //11.把"日期路径+图片名"  作为响应数据返回给前端,前端拿到这个路径数据 后用于回显图片
        //不需要返回D:/files路径，因为后边图片服务器可能会更换。
        return JsonResult.ok(dateDir+fileName );
    }


    /**定义从图片服务器中删除上传的图片的方法removeUploadFile()*/
    @PostMapping("/delUploadFile")
    public JsonResult removeUploadFile(String filePath){
        log.info("UploadController-removeUploadFile(): filePath:{}",filePath);
        //1.把filePath字符串转换为File对象
        String dirPath = System.getProperty("user.dir")+"/files/";
        File file=new File(dirPath+filePath);
        //2.判断文件是否存在,如果存在,则删除
        if(file.exists()){
            file.delete();
        }
        //3.返回响应数据
        return JsonResult.ok();
    }
}
